﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Pseudogenerator.Common.Generators.Core;

namespace Pseudogenerator.Common.Generators
{
    public class Fibonacci
        : MethodBase
    {

        public Fibonacci()
        {
            Anterior = 0;
            ActualIndex = 0;
        }

        public uint x_1 { get; set; }

        public uint Anterior { get; private set; }
        public uint Actual { get; private set; }

        public override bool CanGenerateNext
        {
            get 
            {
                return ActualIndex < m;
            }
        }

        public override uint GetNextValue()
        {
            var resultado = Anterior + Actual;
            Anterior = Actual;
            Actual = resultado;
            return resultado%m;
        }

        public override List<RandomNumber> GetFullList()
        {
            var r = new List<RandomNumber>();
            Actual = x0;
            Anterior = x_1;
            while (CanGenerateNext)
            {
                var v = GetNextValue();
                var tmp = new RandomNumber(this.m) { n = ActualIndex, Xn = v };
                r.Add(tmp);
                ActualIndex++;
            }
            ActualIndex = 0;
            return r;
        }

        public override string ToString()
        {
            return string.Format("X₁ = ({0} + {1}) mod {2}", x_1, x0, m);
        }

    }
}
